#ifndef BASEDIALOG_H
#define BASEDIALOG_H

#include "ADDObjetBase.h"

#include <QtGui/QDialog>

#include <vector>

#include "StatusCode.h"

class QVBoxLayout;
class QHBoxLayout;
class QPushButton;

/**
 * Classe de base pour tous les widgets modaux : c'est à dire qui
 * doivent s'afficher au-dessus d'une autre fenêtre.
 *
 * Il s'agit du pendant de BaseUI pour les QDialog. Cette classe
 * possède un layout vertical (ou seront placé les différents
 * éléments) et un layout horizontal (pour les boutons). Le nombre de
 * boutons pouvant être affichés est quelconque. Les boutons sont à
 * placer dans le conteneur boutons, dans l'ordre d'apparition à
 * l'écran. Les divers widgets que l'on veut afficher sont à mettre
 * dans fenetreLayout, puis, une fois cela fini, on appelle
 * setFenetreLayout().\n
 *
 * La classe possède son niveau de sortie, BaseDialog::interne, que
 * l'on peut modifier avec la méthode setLevel.
 *
 * @author Johan "Solo" Luisier
 */
class BaseDialog : public QDialog, public ADDObjetBase
{
  Q_OBJECT
 public:
  BaseDialog(const QString& nom = "", QWidget *parent = 0);
  BaseDialog(const BaseDialog& dial);
  virtual ~BaseDialog();
  static void setLevel( const DebugLevelType& level, const unsigned& );
 protected:
  /**
   * Variable servant à déterminer si les modifications dans le
   * QDialog sont validées ou annulées.
   */
  bool OK;
  /**
   * Contient tous les boutons qu'il faudra afficher. L'ordre est
   * celui dans lequel les boutons doivent apparaître.
   */
  std::vector< QPushButton* > boutons;
  /**
   * Pointeur sur le layout de la fenêtre.
   */
  QVBoxLayout *fenetreLayout;
  /**
   * Pointeur sur le layout des boutons (qui sont placé dans un
   * QGroupBox).
   */
  QHBoxLayout *boutonsLayout;
  /**
   * Niveau de sortie de la classe.
   */
  static DebugLevelType interne;
  void setBoutonsLayout();
  void setFenetreLayout();
 protected slots:
  virtual void fermer();
  virtual void annuler();
};

#endif // BASEDIALOG_H
